/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package Clases.impl;

import Clases.Advice;
import Clases.Clase;
import Clases.ClasesPackage;
import Clases.Diagrama;
import Clases.Pointcut;
import Clases.Relacion;

import java.util.Collection;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;

import org.eclipse.emf.common.util.EList;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;

import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Diagrama</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * <ul>
 *   <li>{@link Clases.impl.DiagramaImpl#getClases_contenidas <em>Clases contenidas</em>}</li>
 *   <li>{@link Clases.impl.DiagramaImpl#getNombre <em>Nombre</em>}</li>
 *   <li>{@link Clases.impl.DiagramaImpl#getRelaciones_contenidas <em>Relaciones contenidas</em>}</li>
 *   <li>{@link Clases.impl.DiagramaImpl#getPointcuts_contenidos <em>Pointcuts contenidos</em>}</li>
 *   <li>{@link Clases.impl.DiagramaImpl#getAdvices_contenidos <em>Advices contenidos</em>}</li>
 * </ul>
 * </p>
 *
 * @generated
 */
public class DiagramaImpl extends EObjectImpl implements Diagrama {
	/**
	 * The cached value of the '{@link #getClases_contenidas() <em>Clases contenidas</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getClases_contenidas()
	 * @generated
	 * @ordered
	 */
	protected EList<Clase> clases_contenidas;

	/**
	 * The default value of the '{@link #getNombre() <em>Nombre</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getNombre()
	 * @generated
	 * @ordered
	 */
	protected static final String NOMBRE_EDEFAULT = "Nombre_Diagrama";

	/**
	 * The cached value of the '{@link #getNombre() <em>Nombre</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getNombre()
	 * @generated
	 * @ordered
	 */
	protected String nombre = NOMBRE_EDEFAULT;

	/**
	 * The cached value of the '{@link #getRelaciones_contenidas() <em>Relaciones contenidas</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getRelaciones_contenidas()
	 * @generated
	 * @ordered
	 */
	protected EList<Relacion> relaciones_contenidas;

	/**
	 * The cached value of the '{@link #getPointcuts_contenidos() <em>Pointcuts contenidos</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getPointcuts_contenidos()
	 * @generated
	 * @ordered
	 */
	protected EList<Pointcut> pointcuts_contenidos;

	/**
	 * The cached value of the '{@link #getAdvices_contenidos() <em>Advices contenidos</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getAdvices_contenidos()
	 * @generated
	 * @ordered
	 */
	protected EList<Advice> advices_contenidos;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected DiagramaImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return ClasesPackage.Literals.DIAGRAMA;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<Clase> getClases_contenidas() {
		if (clases_contenidas == null) {
			clases_contenidas = new EObjectContainmentEList<Clase>(Clase.class, this, ClasesPackage.DIAGRAMA__CLASES_CONTENIDAS);
		}
		return clases_contenidas;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setNombre(String newNombre) {
		String oldNombre = nombre;
		nombre = newNombre;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ClasesPackage.DIAGRAMA__NOMBRE, oldNombre, nombre));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<Relacion> getRelaciones_contenidas() {
		if (relaciones_contenidas == null) {
			relaciones_contenidas = new EObjectContainmentEList<Relacion>(Relacion.class, this, ClasesPackage.DIAGRAMA__RELACIONES_CONTENIDAS);
		}
		return relaciones_contenidas;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<Pointcut> getPointcuts_contenidos() {
		if (pointcuts_contenidos == null) {
			pointcuts_contenidos = new EObjectContainmentEList<Pointcut>(Pointcut.class, this, ClasesPackage.DIAGRAMA__POINTCUTS_CONTENIDOS);
		}
		return pointcuts_contenidos;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<Advice> getAdvices_contenidos() {
		if (advices_contenidos == null) {
			advices_contenidos = new EObjectContainmentEList<Advice>(Advice.class, this, ClasesPackage.DIAGRAMA__ADVICES_CONTENIDOS);
		}
		return advices_contenidos;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
		switch (featureID) {
			case ClasesPackage.DIAGRAMA__CLASES_CONTENIDAS:
				return ((InternalEList<?>)getClases_contenidas()).basicRemove(otherEnd, msgs);
			case ClasesPackage.DIAGRAMA__RELACIONES_CONTENIDAS:
				return ((InternalEList<?>)getRelaciones_contenidas()).basicRemove(otherEnd, msgs);
			case ClasesPackage.DIAGRAMA__POINTCUTS_CONTENIDOS:
				return ((InternalEList<?>)getPointcuts_contenidos()).basicRemove(otherEnd, msgs);
			case ClasesPackage.DIAGRAMA__ADVICES_CONTENIDOS:
				return ((InternalEList<?>)getAdvices_contenidos()).basicRemove(otherEnd, msgs);
		}
		return super.eInverseRemove(otherEnd, featureID, msgs);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case ClasesPackage.DIAGRAMA__CLASES_CONTENIDAS:
				return getClases_contenidas();
			case ClasesPackage.DIAGRAMA__NOMBRE:
				return getNombre();
			case ClasesPackage.DIAGRAMA__RELACIONES_CONTENIDAS:
				return getRelaciones_contenidas();
			case ClasesPackage.DIAGRAMA__POINTCUTS_CONTENIDOS:
				return getPointcuts_contenidos();
			case ClasesPackage.DIAGRAMA__ADVICES_CONTENIDOS:
				return getAdvices_contenidos();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case ClasesPackage.DIAGRAMA__CLASES_CONTENIDAS:
				getClases_contenidas().clear();
				getClases_contenidas().addAll((Collection<? extends Clase>)newValue);
				return;
			case ClasesPackage.DIAGRAMA__NOMBRE:
				setNombre((String)newValue);
				return;
			case ClasesPackage.DIAGRAMA__RELACIONES_CONTENIDAS:
				getRelaciones_contenidas().clear();
				getRelaciones_contenidas().addAll((Collection<? extends Relacion>)newValue);
				return;
			case ClasesPackage.DIAGRAMA__POINTCUTS_CONTENIDOS:
				getPointcuts_contenidos().clear();
				getPointcuts_contenidos().addAll((Collection<? extends Pointcut>)newValue);
				return;
			case ClasesPackage.DIAGRAMA__ADVICES_CONTENIDOS:
				getAdvices_contenidos().clear();
				getAdvices_contenidos().addAll((Collection<? extends Advice>)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case ClasesPackage.DIAGRAMA__CLASES_CONTENIDAS:
				getClases_contenidas().clear();
				return;
			case ClasesPackage.DIAGRAMA__NOMBRE:
				setNombre(NOMBRE_EDEFAULT);
				return;
			case ClasesPackage.DIAGRAMA__RELACIONES_CONTENIDAS:
				getRelaciones_contenidas().clear();
				return;
			case ClasesPackage.DIAGRAMA__POINTCUTS_CONTENIDOS:
				getPointcuts_contenidos().clear();
				return;
			case ClasesPackage.DIAGRAMA__ADVICES_CONTENIDOS:
				getAdvices_contenidos().clear();
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case ClasesPackage.DIAGRAMA__CLASES_CONTENIDAS:
				return clases_contenidas != null && !clases_contenidas.isEmpty();
			case ClasesPackage.DIAGRAMA__NOMBRE:
				return NOMBRE_EDEFAULT == null ? nombre != null : !NOMBRE_EDEFAULT.equals(nombre);
			case ClasesPackage.DIAGRAMA__RELACIONES_CONTENIDAS:
				return relaciones_contenidas != null && !relaciones_contenidas.isEmpty();
			case ClasesPackage.DIAGRAMA__POINTCUTS_CONTENIDOS:
				return pointcuts_contenidos != null && !pointcuts_contenidos.isEmpty();
			case ClasesPackage.DIAGRAMA__ADVICES_CONTENIDOS:
				return advices_contenidos != null && !advices_contenidos.isEmpty();
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (nombre: ");
		result.append(nombre);
		result.append(')');
		return result.toString();
	}

} //DiagramaImpl
